/**
 * 学生类
 * 继承自Person类，实现选课、退课和打印课表功能
 */
import java.util.ArrayList;
import java.util.List;

public class Student extends Person {
    private List<Course> selectedCourses;  // 学生所选课程
    
    // 构造方法
    public Student(String id, String name, String gender) {
        super(id, name, gender);
        selectedCourses = new ArrayList<>();
    }
    
    // 选课方法
    public void selectCourse(Course course) {
        // 检查是否已选该课程
        if (selectedCourses.contains(course)) {
            System.out.printf("学生信息：编号=%s，姓名=%s，性别=%s，已经选择过课程《%s》（编号：%s，地点：%s）%n",
                    getId(), getName(), getGender(), 
                    course.getName(), course.getId(), course.getLocation());
            return;
        }
        
        // 检查课程是否还有名额
        if (course.addStudent(this)) {
            selectedCourses.add(course);
            System.out.printf("学生信息：编号=%s，姓名=%s，性别=%s，成功选择课程《%s》（编号：%s，地点：%s）%n",
                    getId(), getName(), getGender(),
                    course.getName(), course.getId(), course.getLocation());
        } else {
            System.out.printf("学生信息：编号=%s，姓名=%s，性别=%s，选择课程《%s》（编号：%s，地点：%s）失败，课程已满%n",
                    getId(), getName(), getGender(),
                    course.getName(), course.getId(), course.getLocation());
        }
    }
    
    // 退课方法
    public void dropCourse(Course course) {
        if (selectedCourses.contains(course)) {
            selectedCourses.remove(course);
            course.removeStudent(this);
            System.out.printf("学生信息：编号=%s，姓名=%s，性别=%s，成功退选课程《%s》（编号：%s，地点：%s）%n",
                    getId(), getName(), getGender(),
                    course.getName(), course.getId(), course.getLocation());
        } else {
            System.out.printf("学生信息：编号=%s，姓名=%s，性别=%s，未选择过课程《%s》（编号：%s，地点：%s），无法退课%n",
                    getId(), getName(), getGender(),
                    course.getName(), course.getId(), course.getLocation());
        }
    }
    
    // 打印课表
    public void printCourseSchedule() {
        // 按顺序显示：编号、姓名、性别、所选课程
        System.out.printf("学生信息：编号=%s，姓名=%s，性别=%s%n",
                getId(), getName(), getGender());
        
        if (selectedCourses.isEmpty()) {
            System.out.println("该学生目前未选择任何课程");
        } else {
            System.out.println("所选课程列表（编号、课程名称、上课地点）：");
            for (Course course : selectedCourses) {
                System.out.printf("  课程编号：%s，课程名称：%s，上课地点：%s，授课教师：%s，上课时间：%s，学分：%d%n",
                        course.getId(), course.getName(), course.getLocation(),
                        course.getTeacher().getName(),
                        course.getTime(), course.getCredit());
            }
        }
    }
    
    // 获取所选课程列表
    public List<Course> getSelectedCourses() {
        return selectedCourses;
    }
}
